// 小程序封装网络请求插件
class WxRequest {
  // 默认参数对象
  defaults = {
    baseURL: 'https://njaqs.top/securityinspection', // 请求基准地址
    url: '', // 开发者服务器接口地址
    data: null, // 请求参数
    method: 'GET', // 默认请求方法
    // 请求头
    header: {
      'Content-type': 'application/x-www-form-urlencoded' // 设置数据的交互格式
    },
    timeout: 60000 // 小程序默认超时时间是 60000，一分钟
  }
  // token是否过期
  tokenIsExpire = false
  // 定义 constructor 构造函数，用于创建和初始化类的属性和方法
  constructor(params) {
    this.defaults = Object.assign({}, this.defaults, params)
  }
  /**
   * @description 发起请求的方法
   * @param { Object} options 请求配置选项，同 wx.request 请求配置选项
   * @returns Promise
   */
  request(options) {
    options.url = this.defaults.baseURL + options.url
    options = {
      ...this.defaults,
      ...options
    }
    // 使用 Promise 封装异步请求
    return new Promise((resolve, reject) => {
      // 使用 wx.request 发起请求
      wx.request({
        ...options,
        // 接口调用成功的回调函数
        success: (res) => {
          if (res.statusCode == 200) {
            //  登录失效 跳转登录页重新登录
            if (res.data.code == 9999) {
              if (this.tokenIsExpire) return; //保证只有一个登录过期弹窗
              this.tokenIsExpire = true;
              wx.showModal({
                title: '提示',
                content: '登录过期，请重新登录!',
                showCancel: false,
                success(res) {
                  if (res.confirm) {
                    wx.navigateTo({
                      url: '/pages/login/login',
                    })
                  }
                }
              })
            } else {
              resolve(res.data)
            }
          } else {
            wx.showToast({
              title: res.statusCode,
              icon: 'error'
            })
            wx.navigateTo({
              url: '/pages/error/404/index',
            })
          }
        },
        // 接口调用失败的回调函数
        fail: (err) => {
          wx.showToast({
            title: err.errMsg,
            icon: 'error'
          })
          reject(err)
        }
      })
    })
  }
}

// ----------------- 实例化 ----------------------

// 对 WxRequest 进行实例化
const requestInstance = (option) => {
  const instance = new WxRequest(option);
  return instance;
}
// 将 WxRequest 的实例通过模块化的方式暴露出去
export default requestInstance